package net.y2t72.microblog.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.jsp.jstl.sql.Result;
import javax.servlet.jsp.jstl.sql.ResultSupport;

import org.apache.log4j.Logger;

/**
 * 数据访问工具类
 * 
 * @author Administrator
 * 
 */
public final class BaseDao {
	/**
	 * 对象自身
	 */
	private static BaseDao instance = null;

	/**
	 * log4j记录器
	 */
	private Logger logger = Logger.getLogger(BaseDao.class);

	/**
	 * 单例模式 获取对象实例
	 * 
	 * @return BaseDao对象
	 */
	public static BaseDao getInstance() {
		if (instance == null) {
			synchronized (BaseDao.class) {
				if (instance == null) {
					instance = new BaseDao();
				}
			}
		}
		return instance;
	}

	/**
	 * 数据更新
	 * 
	 * @param sql
	 *            SQL语句
	 * @param param
	 *            参数数组
	 * @return 受影响行数
	 */
	public int executeUpdate(String sql, Object[] param) {
		// 连接对象
		Connection con = null;
		// PreparedStatement对象
		PreparedStatement pstmt = null;
		// 受影响行数
		int rowCount = 0;

		try {
			// 获取连接对象
			con = ConnectionManager.getInstance().getConnection();
			// 获取PreparedStatement
			pstmt = con.prepareStatement(sql);
			// 设置参数
			setParam(param, pstmt);

			// 执行查询 返回受影响行数
			rowCount = pstmt.executeUpdate();
		} catch (SQLException e) {
			logger.info("Error:" + e.getMessage(),e);
		} catch (Exception e) {
			logger.info("Error:" + e.getMessage(),e);
		} finally {
			// 关闭连接
			close(pstmt, con);
		}
		return rowCount;
	}

	public Result executeQuery(String sql, Object[] param) {
		// 连接对象
		Connection con = null;
		// PreparedStatement对象
		PreparedStatement pstmt = null;
		// ResultSet 对象
		ResultSet rs = null;
		// Result对象
		Result result = null;

		try {
			// 获取连接对象
			con = ConnectionManager.getInstance().getConnection();
			// 获取PreparedStatement
			pstmt = con.prepareStatement(sql);
			//设置参数
			setParam(param,pstmt);
			// 查询 返回结果集
			rs = pstmt.executeQuery();

			// 将结果集转成Result
			result = ResultSupport.toResult(rs);
		} catch (SQLException e) {
			logger.info("Error:" + e.getMessage(),e);
		} catch (Exception e) {
			logger.info("Error:" + e.getMessage(),e);
		} finally {
			// 关闭连接
			close(rs, pstmt, con);
		}
		// 返回
		return result;
	}

	/**
	 * 设置参数
	 * 
	 * @param param
	 *            参数数组
	 * @param pstmt
	 *            PreparedStatement对象
	 * @throws SQLException
	 *             SQL异常
	 */
	private void setParam(Object[] param, PreparedStatement pstmt)
			throws SQLException {
		// 参数赋值
		if (param != null) {
			for (int i = 0; i < param.length; i++) {
				pstmt.setObject(i + 1, param[i]);
			}
		}
	}

	/**
	 * 关闭连接
	 * 
	 * @param rs
	 *            ResultSet对象
	 * @param pstmt
	 *            PreparedStatement对象
	 * @param con
	 *            Connection对象
	 */
	public void close(ResultSet rs, PreparedStatement pstmt, Connection con) {
		try {
			if (rs != null) {
				rs.close();
			}
			if (pstmt != null) {
				pstmt.close();
			}
			if (con != null) {
				con.close();
			}
		} catch (SQLException e) {
			logger.info("数据连接关闭错误,异常信息为:" + e.getMessage(),e);
		}
	}

	/**
	 * 关闭连接
	 * 
	 * @param pstmt
	 *            PreparedStatement对象
	 * @param con
	 *            Connection对象
	 */
	public void close(PreparedStatement pstmt, Connection con) {
		try {
			if (pstmt != null) {
				pstmt.close();
			}
			if (con != null) {
				con.close();
			}
		} catch (SQLException e) {
			logger.info("数据连接关闭错误,异常信息为:" + e.getMessage(),e);
		}
	}
}
